Connecting to target:

Ideen i denne del er at lære at connecte til target samt cross compile

Del 1:
Der er forbindelse igennem VM ware

Del 2: Connection
Vi ønsker at oprette en secure forbindelse til Devkit 8000(target) dette gøres ved at benytte ssh. Oplysninger om dette er fundet på IHA side omkring devkit8000.
stud@GoldenImage:~$ ssh 10.9.8.2 -l root
root@10.9.8.2's password:
root@beagleboard:~#
Kan også gøres med følgende kommando
stud@GoldenImage:~$ ssh root@10.9.8.2
root@10.9.8.2's password:
root@beagleboard:~#
 
Ved hjælp af en af disse 2 kan vi oprette forbindelse til target og herefter har vi mulighed for at arbejde over på target.

Del 3: Moving files
Ved hjælp af secure copy kopiers en fil til target, vi ligger filen i mappen tmp. For at benytte seccure copy benyttes commandoen scp. For at få adgang til dette bruges sudo for at få tilladelse til at gøre dette.
stud@GoldenImage:~/Dropbox/3_semester/ISU/Ovelser/Exercise 3$ touch abc
stud@GoldenImage:~/Dropbox/3_semester/ISU/Ovelser/Exercise 3$ scp abc root@10.9.8.2:/tmp
root@10.9.8.2's password:
abc                                                  100%    0     0.0KB/s   00:00
stud@GoldenImage:~/Dropbox/3_semester/ISU/Ovelser/Exercise 3$
 
vi kan se at filen er blevet overført da der bliver udskrevet abc 100%.


Del 4: Create shell script for ssh og scp
Connect (conn2tgt)
#!/bin/sh
ssh root@10.9.8.2
For cp2tgt skal der bruges mindst et argument. Efter dette undersøger vi om det er en mappe, hvis dette er opfyldt kopierer vi mappen, ellers ser vi om det er en ren fil og denne vil så blive kopieret.

#!/bin/sh
#
IP="10.9.8.2"
DIR=":~/files"
SCP="/usr/bin/scp"
USER="root@"
#
"Usage
# - se om argument
if [$# -ne 1]; then
   echo "Usage: cp2tgt <file>"
   exit
fi
if[ -d $1]; then
    echo "Copy mappe"
    $SCP -r $1 ${USER}$IP}$DIR
else
    echo "Copy file"
    $SCP $1 ${USER}${IP}$DIR
fi

Building C++ programs for target


Del 1: Cross compiling the program Hello World and running it on target
I denne del af opgaven ønsker vi at benytte hello_world filen fra tidligere og cross compile den til at køre på target, dette gøres ved brug af compileren
Arm-angstrom-linux-gnueabi-g++ -o hello_tgt hello.cpp
vi kan herefter teste om filen er compilet correct ved at benytte commandoen: file hello_tgt, kan vi se at filen er blevet compilet til target
stud@GoldenImage:~/Dropbox/3_semester/ISU/Ovelser/Exercise 3$ file hello_tgt
hello_tgt: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
ved at kopier filen til target som i del 1 kan vi køre filen på taget ved at benytte samme commandoer som på host.
root@beagleboard:/tmp# ./hello_tgt
Hello world!
root@beagleboard:/tmp#

Del 2: Using makefiles to build host and target programs
Compiling til target ved makefile
Her bruges compileren "arm-angstrom-linux-gnueabi-g++" compileren til at compile til target, ellers er makefilen opbygge på samme måde som vi tidligere har gjort det.
stud@GoldenImage:~/Dropbox/3 semester/ISU/Ovelser/Exercise 3/del2$ make -f makefile.target
arm-angstrom-linux-gnueabi-g++ -c hello.cpp
arm-angstrom-linux-gnueabi-g++ -o hello_tgt hello.o
stud@GoldenImage:~/Dropbox/3 semester/ISU/Ovelser/Exercise 3/del2$
Hefter copiers filen til target og testes som tidligere
root@beagleboard:/tmp# ./hello_tgt
Hello world!
root@beagleboard:/tmp#
ved at benytte commandoen make -f makefile.target fortæller vi at vi ønsker at bruge makefilen som skal compile til target, dette betyder at vi har mulighed for at have flere makefiles, så vi kan have en makefile for host og target og så blot vælge hvad filen skal bruges til.

Del 3: Cross compiling with more extended makefiles
Vi vil nu forsøge at cross compile flere filer med makefile, dette gøres ved at benytte samme makefile som i Øvelse 2, og så ændre compileren til at være compileren der compiler til target.
stud@GoldenImage:~/Dropbox/3 semester/ISU/Ovelser/Exercise 3/del3$ make -f makefile.target
arm-angstrom-linux-gnueabi-g++ -c main.cpp
arm-angstrom-linux-gnueabi-g++ -c part1.cpp
arm-angstrom-linux-gnueabi-g++ -c part2.cpp
arm-angstrom-linux-gnueabi-g++ -o target_parts1+2 main.o part1.o part2.o
stud@GoldenImage:~/Dropbox/3 semester/ISU/Ovelser/Exercise 3/del3$ ls
main.cpp   makefile         makefile.target~  part1.h    part2.cpp~  part2.o
main.cpp~  makefile~        part1.cpp         part1.o    part2.h     target_parts1+2
main.o     makefile.target  part1.cpp~        part2.cpp  part2.h~
stud@GoldenImage:~/Dropbox/3 semester/ISU/Ovelser/Exercise 3/del3$ file target_parts1+2target_parts1+2: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
stud@GoldenImage:~/Dropbox/3 semester/ISU/Ovelser/Exercise 3/del3$
Køre på target
root@beagleboard:/tmp# ./target_parts1+2
 this is part1!
 this is part2!
root@beagleboard:/tmp#


Del4: Improving cross compilation handling in makefiles
Vi ser i del 3 at vi kan bruge makefile til at compile til target, vi ser at vi kan have to makefiles hvor den ene fungere til host og den anden til target. Problemet er blot at når vi bruger den ene makefile for f.eks. host og så bagefter køre makefilen for target så sletter vi filerne som i forvejen var lavet, dette er vi ikke interesseret i, så derfor vil vi gerne lave to makefiles(en for host, en for target) disse skal lægge deres filer i to forskellige mapper sådan at vi har en mappe for host og en for target.
For at få dette til at virke må vi ændre lidt i makefilerne. eks. for target:
først: OBJECTS = ${SOURCES:.cpp=.o}
Efter ændring: OBJECTS = target/${SOURCES:.cpp=.o}
Dette var første ændring, anden ændring:
Før: EXECUTABLE=hello_tgt
Efter: EXECUTABLE=target/hello_tgt
Sidste ændring der skal foretages:
Før: hello.o: hello.cpp
     ${CC} -c hello.cpp -o hello.o
 
Efter: target/hello.o: hello.cpp
       ${CC} -c hello.cpp -o target/hello.o
Vi ser altså at der i filen skal foretages 3 ændringer, disse ændre er de samme for makefile til host. Ved hjælp af dette får vi fortalt at vi ønsker at objektet(arbjedsområde) placers i mappen tagret. Ligeledes placeres alle o filer i denne mappe. Når compilingen er kørt til ende vil execute filen være at finde i denne mappe.
Om makefilen skulle have været lavet til host skulle vi have haft en mappe der hed host f.eks. og så have ændret mappen fra target til host.
Når vi gør det på denne måde kan vi compile ud i forskellige mappe og på denne måde løser vi problemet med at filerne bliver slettet når vi compiler til de forskellige, ligeledes så kan vi køre en make clean uden at slette filerne for target og omvendt.

For egen forståelse er den fulde makefile for taget vidst nedenfor:
Mapperne target og host, dannes forinden ved commandoen mkdir:

#Hello world makefile for target
#Sources
SOURCES = hello.cpp
OBJECTS = target/${SOURCES:.cpp=.o}
EXECUTABLE=target/hello_tgt
#Compile
CC=arm-angstrom-linux-gnueabi-g++
CFLAGS= -Wall -g
 
#Tagets
build: ${OBJECTS}
${CC} -o ${EXECUTABLE} ${OBJECTS}
 
target/hello.o: hello.cpp
${CC} -c hello.cpp -o target/hello.o
 
clean:
@echo "Removing files..."
rm -f ${EXECUTABLE} ${OBJECTS}
 
 
 
help:
@echo "Avaiable targets..."
@echo "- help (watching now)"
@echo "- build (to build the binary)"
@echo "- clean (to cleanup everything)"
@echo "Print, what in folder"
@ls

For host er koden næsten den samme som for target, man benytter blot en anden compiler og der refereres til en anden mappe til placering af o + exe filer.

Del 5
For at få Eclipse til at compile for target (devkit8000) ændres compileren i settings for projektet
snapshot3.png
under proporties > settings må vi altså i commando linien indskrive den compiler vi vil benytte da vi skal compile til target, for c++ skal vi altså bruge
arm-angstrom.linux-gnuebi-g++
Ligeledes vælger vi Cross GCC for at lave en cross compiler.


Hvad har vi fået ud af denne øvelse:
Vi har lært at connect og kopierer filer til target(devKit8K). Dette gør det muligt at arbejde på target.
Vi har også lært at cross compile til target så man kan køre sine programmer på target. Dette er hele esensen i kurset; at benytte én
embedded device.
Vi har også lært at bruge eclipse til at compile vores projekts for os ved at tilføje commands til eclipse så den bruger den rigtige compiler. Dette er vigtigt da det gør det nemmere for os at compile.
Mange hjælpemidler kan findes under Devkit8000 på wikispaces.